4. 漏洞的常见类型 什么是漏洞?

软件中的错误。

例子:

漏洞可以被用来进行各种不受欢迎的活动,如:

它们是如何被用于恶意活动的?

常见的漏洞类型

整数溢出/下溢,栈/堆溢出,越界读/写,释放后使用,双重释放

1. 整数溢出

整数数据类型中的漏洞,它们存储数据的方式。

例子:

unsigned int j;
int i;

整数的大小 = 4 bytes

最大值 = 11111111 11111111 11111111 11111111

每个位可以是0或1。所以它可以表示2个ue,它可以存储的是 = 2^32

签名还是未签名?

MSB 用于签名。

1= 00000000000000000000000000000001

-1 = 10000000000000000000000000000001

有符号整数的最大值= 0x7FFFFFFF

无符号整数的最大值 = 0xFFFFFFFF

在这种情况下会发生什么?

int i;
unsigned int j;
j = 0xFFFFFFFF + 1 

结果将变成0,传输1位将被截断。

i = 0x7FFFFFFFF + 1

结果将变成-0x8000000(负数)

Integer Overflow

2. 整数下溢

整数的大小 = 4 bytes

有符号与无符号?

有符号int的范围= -0x80000000 至 0x7FFFFFFF

无符号的int的范围 = 0 至 0xFFFFFFFF

在这种情况下会发生什么?

int i;
i = -0x80000000  1 = 0x7FFFFFFF

i = 可能的最大正数。

Integer Underflow

3. 栈(Stack )溢出

栈溢出- overflowing the local variable stored inside the stack. They can corrput data on the stack like return address and other variables. Example:

Function foo(){
char var1[8];
char var2[100];
memcpy(var1,var2,sizeof(var2)); 🡪 stack overflow
}

Following is a real life example of a stack overflow vulnerability in vlc media player: Stack Overflow

引用 : https://hackerone.com/reports/489102

4. 堆(Heap)溢出

堆溢出 - 当进程不确定内存大小时,就会使用堆。因此,它们在运行时由malloc、calloc、realloc等函数分配。这种内存分配的溢出会破坏各种堆管理数据。例子:

function test(){
char *var1 = (char*) malloc(8);
char var2[100];
memcpy(var1,var2,sizeof(var2)); 🡪 heap overflow
}

5. 越界读取

越界读取 - 内存访问或写入操作超出了堆栈内存的允许限度。在栈和堆内存中都可能发生。

例子:

char a[10];
char b;
b=a[100];  🡪OOB Read
a[100] = c'; 🡪OOB Write

Following is a real life out of bound read issue in libgd: Out of bound read 

参考资料 https://github.com/libgd/libgd

6. 越界写入

越界写入- 内存访问或写操作超出了堆内存的允许限度。可以同时发生在堆栈和堆内存中。

例子:

char* a = (char*)malloc(10);
char b;
b=a[100];  🡪 OOB read
a[100] =‘c'; 🡪OOB Write

7. free后使用

free(释放)后使用- 释放内存后使用内存。

例子:

char *buff = (char*)malloc(10);
free(buff);
buff[0]=‘c'; 🡪 use after free

下面是一个关于libtiff中释放后使用漏洞的真实例子:

use after free

参考资料: https://www.asmail.be/msg0055359936.html

8. 多次free

多次free -多次释放分配的内存。例子:

char *buff = (char*)malloc(10);
free(buff);
free(buff); 🡪 double free
来源: http://fuzzing.in/codelabs/fuzzing_opensource/index.html?index=..%2F..index#3